package io.alvin.jframework.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;

/**
 * 代理管理类（供切面类调用）
 *
 * 提供一个创建代理对象的方法，输入一个目标类和一组Proxy接口实现，输出一个代理对象
 * 使用CGLib提供的Enhancer#create方法来创建代理对象，将intercept的参数传入ProxyChain的构造器中。
 *
 * Created by Alvin on 2017/7/10.
 */
public class ProxyManager {

    public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList) {
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams, proxyList);
            }
        });
    }
}
